import smcrypto from 'sm-crypto'
import CryptoJS from 'crypto-js'
const production = import.meta.env.VITE_NODE_ENV === 'production'

const publicKey = '039dd471af3c8d495c295db05d8f7c20b7333baf9e6bfe4d40e12d87d3136d474c' //公钥
const privateKey = '' //私钥

export const useCrypto = () => {
  /**
   * 加密
   * @param word 要加密的明文
   * @returns
   */
  const encrypt = (word: string) => {
    // 生成 SM2 密钥对
    // const { publicKey, privateKey } = smcrypto.generateKeyPair();
    // 使用 SM2 公钥进行加密
    return smcrypto.sm2.doEncrypt(word, publicKey, 1)
  }
  /**
   * 解密
   * @param word 要解密的密文
   * @returns
   */
  const decrypt = (word: string) => {
    // 使用 SM2 私钥进行解密
    return smcrypto.sm2.doDecrypt(word, privateKey, 1)
  }

  /***************** 分割线 以下为本地加密 ***********************/

  /**
   * 十六位十六进制数作为密钥
   */
  const paw = () => {
    return CryptoJS.enc.Utf8.parse('PAW_KEY_XU123456')
  }

  /**
   * 十六位十六进制数作为密钥偏移量
   */
  const iv = () => {
    return CryptoJS.enc.Utf8.parse('PAW_KEY_XU789456')
  }

  /**
   * 判断是否可以被解析
   * @param data 解析数据
   * @returns
   */
  const isJSON = (data) => {
    try {
      JSON.parse(data) // 尝试解析数据
      return true // 若没有抛出错误，则表明数据可以被正常解析
    } catch (error) {
      return false // 若发生错误，则表明数据无法被解析
    }
  }
  /**
   * 加密
   * @param word 要加密的明文
   * @returns
   */
  const localEncrypt = (word) => {
    if (!production) return word
    if (word instanceof Array || word instanceof Object) {
      word = JSON.stringify(word)
    }
    const key = CryptoJS.enc.Utf8.parse(paw())
    const srcs = CryptoJS.enc.Utf8.parse(word)
    const encrypted = CryptoJS.AES.encrypt(srcs, key, {
      iv: iv(),
      mode: CryptoJS.mode.ECB,
      padding: CryptoJS.pad.Pkcs7
    })
    return encrypted.toString()
  }

  /**
   * 解密
   * @param word 要解密的密文
   * @returns
   */
  const localDecrypt = (word) => {
    if (!production || !word) return word
    const key = CryptoJS.enc.Utf8.parse(paw())
    const decrypt = CryptoJS.AES.decrypt(word, key, {
      iv: iv(),
      mode: CryptoJS.mode.ECB,
      padding: CryptoJS.pad.Pkcs7
    })
    const decrypted = CryptoJS.enc.Utf8.stringify(decrypt).toString()
    return isJSON(decrypted) ? JSON.parse(decrypted) : decrypted || ''
  }

  return { encrypt, decrypt, localEncrypt, localDecrypt }
}
